package com.linln.wtp.controller.user;

import com.aliyuncs.exceptions.ClientException;
import com.linln.common.utils.ALiSMSUtil;
import com.linln.component.cache.util.RedisUtil;
import com.linln.common.utils.IpUtil;
import com.linln.common.utils.SessionUtil;
import com.linln.component.wtpshiro.annotation.PassToken;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * @author : pengliang
 * @version V1.0
 * @Project: easyweb-jwt
 * @Package com.donglei.soft.system.controller
 * @Descriptio /**
 * @Project: easyweb-jwt
 * @Package com.donglei.soft.system.controller
 * @Description: TODO
 * @date Date : 2020年11月19日 20:13
 */

@Slf4j
@Api(value = "发送短信", tags = "code")
@RestController
@RequestMapping("/code")
public class MessageController {


    @Autowired
    private RedisUtil redisUtil;


    @ApiOperation(value = "发送短信")
    /**
     * @param phone   收验证码的手机号
     * @param session 用户session
     * @return map status是否登录成功  message登录失败的提示信息
     */
    @PassToken
    @PostMapping("sendCode")
    public Map<String, Object> sendCode(@RequestParam("phone") String phone) {
//        String id = SessionUtil.getSession().getId();
        String ip = IpUtil.getIpAddr(SessionUtil.getRequest());
        log.error("sendCode------ip = " + ip);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 500);
        String codeKey = "CodeKey"+phone;
//        String codeKey = "Code";
        try {
//            if (redisUtil.get(codeKey) != null) {
//                map.put("msg", "请稍后再发送验证码");
//                return map;
//            }
            //获取随机四位数字的验证码
            String code = String.valueOf(new Random().nextInt(9000) + 999);
            //发送短信
            String msg = ALiSMSUtil.sendSmsRS(phone, code);
            if(msg.contains("触发天级流控Permits")){
                map.put("msg", "当日获取验证码次数已达上限，请稍后再试");
                return map;
            }else if(msg.contains("触发分钟级流控Permits")){
                map.put("msg", "每分钟只能发送一次，请稍后再试");
                return map;
            }else if(msg.contains("触发小时级流控Permits")){
                map.put("msg", "每小时钟只能发送五次，请稍后再试");
                return map;
            }
            map.put("code", 200);
            map.put("msg", "发送成功");
            //将验证码保存  设置时间为60秒 用户注册登录的手机号码要跟收验证码的号码一致
            redisUtil.set(phone, code, 60 * 5);
            log.error(phone + ":" + code);
            redisUtil.set(codeKey, 60);
            //不能重复发送验证码 1天内只能发送5次
//                判断key是否存在  存在自增1
//            if (redisUtil.hasKey(codeKey)) {
//                redisUtil.set(codeKey, redisUtil.incr(codeKey, 1));
//                //不存在设置设置key value为1  时间为60秒
//            } else {
//                redisUtil.set(codeKey, 1, 60 * 60 * 24);
//            }
//            } else {
//                map.put("msg", "请稍后再发送验证码");
//            }
        } catch (Exception e) {
            log.error(e.getMessage());
            //返回错误消息
            map.put("msg", "发送失败，请稍后再试");
        }
        return map;
    }

    public static void main(String[] args) {
        try {
            ALiSMSUtil.sendSms("13064115080", "1234");
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}
